module cs_adder_multiplier (clock, reset, start, a, b, fim,  resultado, overflow, truec);

	parameter SIZE = 32;
	parameter SIZEP = 64;
	
	//input
	input clock;
	input reset;
	input start;
	input [SIZE-1:0] a;
	input [SIZE-1:0] b;
	input truec;
		
	output fim;
	output overflow;
	output [SIZEP-1:0] resultado;		
		
	wire done;
	wire load_product;
	wire load_multiplication;
	wire shift_multiplication;
	wire shift_product;
	wire reset_product;
	wire [SIZE-1:0] resultado_multiplicacao;
	wire [SIZE-1:0] carry_out;
	wire [SIZE-1:0] result_op_b;
	wire [SIZE-1:0] final_deslocado;
	wire [SIZE-1:0] resultado_final;
	
	
	controller controle (.clk(clock), .reset(reset), .start(start), .done(done), .load_multiplication(load_multiplication), 
						.load_product(load_product), .shift_multiplication(shift_multiplication), .shift_product(shift_product),
						.reset_product(reset_product));
	
	
	multiplication multiplicador (.op_b(b), .op_a(a), .clk(clock), .load(load_multiplication), .shift(shift_multiplication), 
									.result(result_op_b));
								 
	
	multiplication_module modulo_multiplicador (.shift(shift_product), .b(result_op_b), .product(resultado_multiplicacao), 
												.c_out(carry_out), .reset(reset | reset_product), .final_deslocado(final_deslocado));
	
	
	carrySelect32bits carry_select (.number1(resultado_multiplicacao), .number2(carry_out), .truecin(truec), .truecout(overflow), 
									.trueout(resultado_final));
									
	
	assign resultado = {resultado_final,final_deslocado};
	assign fim = done;
	
endmodule 
